home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 59454 / 59454.xpi / content / util / Module.js < prev    next >
Text File  |  2010-01-14  |  3KB  |  104 lines

  1. /* 
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. var BartModule;
  7.  
  8. // make sure we haven't been loaded
  9. if(BartModule && (typeof BartModule != "object" || BartModule.NAME))
  10. {
  11.     throw new Error("Namespace 'BartModule' already exists");
  12. }
  13.  
  14. // create our namespace
  15. BartModule = {};
  16.  
  17. BartModule.NAME = "BartModule";
  18. BartModule.VERSION = 0.1;
  19.  
  20. // refer to the global scope
  21. BartModule.globalNamespace = this;
  22. // Module name -> Module map
  23. BartModule.modules = { "Module" : BartModule};
  24.  
  25. /**
  26.  * This function creates and returns a namespace object for the specified name.
  27.  * It throws an error if the namespace already exists but the name is not the same, or
  28.  * if any of the property components of the namespace exist and are not objects.
  29.  *
  30.  * Sets a NAME property of the new namespace to its name.
  31.  * If the version argument is specified, set the VERSION property of the namespace.
  32.  *
  33.  * A mapping for the new namespace is added to the BartModule.modules object.
  34.  */
  35. BartModule.createNamespace = function(name, version)
  36. {
  37.     if(!name)
  38.     {
  39.         throw new Error("BartModule.createNamespace(): name required");
  40.     }
  41.  
  42.     if(name.charAt(0) == '.'
  43.         || name.charAt(name.length - 1) == '.'
  44.         || name.indexOf("..") != -1)
  45.     {
  46.         throw new Error("BartModule.createNamespace(): illegal name: " + name);
  47.     }
  48.  
  49.     var parts = name.split('.');
  50.  
  51.     var container = BartModule.globalNamespace;
  52.     for(var i = 0; i < parts.length; i++)
  53.     {
  54.         var part = parts[i];
  55.         // if there is no property of container with this name, create an empty object
  56.         if(!container[part])
  57.         {
  58.             container[part] = {};
  59.         }
  60.         else if(typeof container[part] != "object")
  61.         {
  62.             // if there is already a property, make sure it's an object
  63.             var n = parts.splice(0, i).join('.');
  64.  
  65.             throw new Error(n + " already exists and is not an object");
  66.         }
  67.  
  68.         container = container[part];
  69.     }
  70.  
  71.     var namespace = container;
  72.  
  73.     // it's an error to define a namespace again with a different NAME property.
  74.     if(namespace.NAME)
  75.     {
  76.         if(namespace.NAME != name)
  77.         {
  78.             throw new Error("Namespace " + name + " exists but with a different NAME property: " + namespace.NAME);
  79.         }
  80.     }
  81.     else
  82.     {
  83.         namespace.NAME = name;
  84.     }
  85.  
  86.     if(version)
  87.     {
  88.         namespace.VERSION = version;
  89.     }
  90.  
  91.     // register this namespace to the module map
  92.     BartModule.modules[name] = namespace;
  93.  
  94.     return namespace;
  95. };
  96.  
  97. /**
  98.  * Test whether the module with the specified name has been defined.
  99.  * Return true if it's defined and false otherwise.
  100.  */
  101. BartModule.isDefined = function(name)
  102. {
  103.     return name in BartModule.modules;
  104. };